/*********************************************************************************
  *FileName:  nsuc16xx_gpio.h
  *Version:   V1.0
  *Date:      2023-09-21
**********************************************************************************/
#ifndef __nsuc16xx_gpio_H__
#define __nsuc16xx_gpio_H__

/***************************************Includes***********************************/
#include "nsuc16x0.h"

/***************************************Macros***********************************/
#define GPIO_Pin_0          ((uint16_t)0x0001)   /*!< Pin 0 selected */
#define GPIO_Pin_1          ((uint16_t)0x0002)   /*!< Pin 1 selected */
#define GPIO_Pin_2          ((uint16_t)0x0004)   /*!< Pin 2 selected */
#define GPIO_Pin_3          ((uint16_t)0x0008)   /*!< Pin 3 selected */
#define GPIO_Pin_4          ((uint16_t)0x0010)   /*!< Pin 4 selected */
#define GPIO_Pin_5          ((uint16_t)0x0020)   /*!< Pin 5 selected */
#define GPIO_Pin_6          ((uint16_t)0x0040)   /*!< Pin 6 selected */
#define GPIO_Pin_7          ((uint16_t)0x0080)   /*!< Pin 7 selected */
#define GPIO_Pin_8          ((uint16_t)0x0100)   /*!< Pin 8 selected */
#define GPIO_Pin_9          ((uint16_t)0x0200)   /*!< Pin 9 selected */
#define GPIO_Pin_10         ((uint16_t)0x0400)  /*!< Pin 10 selected */
#define GPIO_Pin_All        ((uint16_t)0xFFFF) /*!< All pins selected */

#define GPIO_PinSource0     ((uint8_t)0x00)
#define GPIO_PinSource1     ((uint8_t)0x01)
#define GPIO_PinSource2     ((uint8_t)0x02)
#define GPIO_PinSource3     ((uint8_t)0x03)
#define GPIO_PinSource4     ((uint8_t)0x04)
#define GPIO_PinSource5     ((uint8_t)0x05)
#define GPIO_PinSource6     ((uint8_t)0x06)
#define GPIO_PinSource7     ((uint8_t)0x07)
#define GPIO_PinSource8     ((uint8_t)0x08)
#define GPIO_PinSource9     ((uint8_t)0x09)
#define GPIO_PinSource10    ((uint8_t)0x0A)

#define GPIO0_AF_IO_IN      ((uint8_t)0x00)
#define GPIO0_AF_IO_OUT     ((uint8_t)0x01)
#define GPIO0_AF_CAP0_OUT   ((uint8_t)0x02)
#define GPIO0_AF_TIM0_OUT   ((uint8_t)0x03)
#define GPIO0_AF_SPI_CS     ((uint8_t)0x04)
#define GPIO0_AF_TIM0_IN    ((uint8_t)0x05)
#define GPIO0_AF_CAP0_IN    ((uint8_t)0x06)
#define GPIO0_AF_ADC0       ((uint8_t)0x07)

#define GPIO1_AF_IO_IN      ((uint8_t)0x00)
#define GPIO2_AF_IO_OUT     ((uint8_t)0x01)
#define GPIO1_AF_CAP1_OUT   ((uint8_t)0x02)
#define GPIO1_AF_TIM1_OUT   ((uint8_t)0x03)
#define GPIO1_AF_SPI_CLK    ((uint8_t)0x04)
#define GPIO1_AF_TIM1_IN    ((uint8_t)0x05)
#define GPIO1_AF_CAP1_IN    ((uint8_t)0x06)
#define GPIO1_AF_ADC1       ((uint8_t)0x07)

#define GPIO2_AF_IO_IN      ((uint8_t)0x00)
#define GPIO2_AF_IO_OUT     ((uint8_t)0x01)
#define GPIO2_AF_CAP2_OUT   ((uint8_t)0x02)
#define GPIO2_AF_SWO        ((uint8_t)0x03)
#define GPIO2_AF_SPI_MOSI   ((uint8_t)0x04)
#define GPIO2_AF_UART_RX    ((uint8_t)0x05)
#define GPIO2_AF_CAP2_IN    ((uint8_t)0x06)
#define GPIO2_AF_ADC2       ((uint8_t)0x07)

#define GPIO3_AF_IO_IN      ((uint8_t)0x00)
#define GPIO3_AF_IO_OUT     ((uint8_t)0x01)
#define GPIO3_AF_TIM0_OUT   ((uint8_t)0x02)
#define GPIO3_AF_UART_RX    ((uint8_t)0x03)
#define GPIO3_AF_SPI_MISO   ((uint8_t)0x04)
#define GPIO3_AF_TIM0_IN    ((uint8_t)0x05)
#define GPIO3_AF_PWMIO_OUT  ((uint8_t)0x06)
#define GPIO3_AF_ADC3       ((uint8_t)0x07)

#define GPIO4_AF_IO_IN      ((uint8_t)0x00)
#define GPIO5_AF_IO_OUT     ((uint8_t)0x01)
#define GPIO4_AF_TIM1_OUT   ((uint8_t)0x02)
#define GPIO4_AF_UART_TX    ((uint8_t)0x03)
#define GPIO4_AF_SWO        ((uint8_t)0x04)
#define GPIO4_AF_TIM1_IN    ((uint8_t)0x05)
#define GPIO4_AF_PWMIO_IN   ((uint8_t)0x06)
#define GPIO4_AF_ADC4       ((uint8_t)0x07)

#define GPIO5_AF_IO_IN      ((uint8_t)0x00)
#define GPIO5_AF_IO_OUT     ((uint8_t)0x01)
#define GPIO5_AF_SYSDBG0    ((uint8_t)0x02)
#define GPIO5_AF_SPI_CS     ((uint8_t)0x03)
#define GPIO5_AF_CAP0_OUT   ((uint8_t)0x04)
#define GPIO5_AF_PWMIO_IN   ((uint8_t)0x05)
#define GPIO5_AF_CAP0_IN    ((uint8_t)0x06)
#define GPIO5_AF_ADC5       ((uint8_t)0x07)

#define GPIO8_AF_IO_IN      ((uint8_t)0x00)
#define GPIO8_AF_IO_OUT     ((uint8_t)0x01)
#define GPIO8_AF_SYSDBG1    ((uint8_t)0x02)
#define GPIO8_AF_SPI_CLK    ((uint8_t)0x03)
#define GPIO8_AF_CAP1_OUT   ((uint8_t)0x04)
#define GPIO8_AF_PWMIO_IN   ((uint8_t)0x05)
#define GPIO8_AF_CAP1_IN    ((uint8_t)0x06)
#define GPIO8_AF_VREFP      ((uint8_t)0x07)

#define GPIO9_AF_IO_IN      ((uint8_t)0x00)
#define GPIO9_AF_IO_OUT     ((uint8_t)0x01)
#define GPIO9_AF_SYSDBG2    ((uint8_t)0x02)
#define GPIO9_AF_SPI_MOSI   ((uint8_t)0x03)
#define GPIO9_AF_CAP2_OUT   ((uint8_t)0x04)
#define GPIO9_AF_UART_TX    ((uint8_t)0x05)
#define GPIO9_AF_CAP2_IN    ((uint8_t)0x06)
#define GPIO9_AF_VREFN      ((uint8_t)0x07)

#define GPIO10_AF_IO_IN     ((uint8_t)0x00)
#define GPIO10_AF_IO_OUT    ((uint8_t)0x01)
#define GPIO10_AF_SYSDBG3   ((uint8_t)0x02)
#define GPIO10_AF_SPI_MISO  ((uint8_t)0x03)
#define GPIO10_AF_PWMIO_OUT ((uint8_t)0x04)
#define GPIO10_AF_UART_RX   ((uint8_t)0x05)
#define GPIO10_AF_SWO       ((uint8_t)0x06)

/***************************************Variables***********************************/
typedef enum
{
    GPIO_Mode_AIN = 0x0,
    GPIO_Mode_IN_FLOATING = 0x04,
    GPIO_Mode_IPD = 0x28,
    GPIO_Mode_IPU = 0x48,
    GPIO_Mode_Out_OD = 0x14,
    GPIO_Mode_Out_PP = 0x10,
    GPIO_Mode_AF_OD = 0x1C,
    GPIO_Mode_AF_PP = 0x18
} GPIOMode_TypeDef;

/**
 * @brief  Bit_SET and Bit_RESET enumeration
 */

typedef enum
{
    Bit_RESET = 0,
    Bit_SET
} BitAction;

/**
 * @brief  GPIO Configuration PullUp PullDown enumeration
 */
typedef enum
{
    GPIO_PuPd_NOPULL = 0x00,
    GPIO_PuPd_UP = 0x01,
    GPIO_PuPd_DOWN = 0x02
} GPIOPuPd_TypeDef;

/**
 * @brief  GPIO Output type enumeration
 */
typedef enum
{
    GPIO_OType_PP = 0x00,
    GPIO_OType_OD = 0x01
} GPIOOType_TypeDef;

/***************************************Functions***********************************/
void GPIO_SetBits(uint32_t GPIO_Pin);
void GPIO_ResetBits(uint32_t GPIO_Pin);
uint8_t GPIO_ReadInputDataBit(uint32_t GPIO_Pin);
uint8_t GPIO_ReadOutputDataBit(uint32_t GPIO_Pin);
void GPIO_PinAFConfig(uint16_t GPIO_PinSource, uint8_t GPIO_AF);
void GPIO_PuPdConfig(uint32_t GPIO_Pin, GPIOPuPd_TypeDef GPIO_PuPd);
void GPIO_OutTypeConfig(uint32_t GPIO_Pin, GPIOOType_TypeDef GPIO_OType);
void GPIO_DebounceConfig(uint32_t GPIO_Pin, FunctionalState NewState);
void GPIO_DebounceTimeConfig(uint32_t DT);

#endif
/* [] END OF nsuc16xx_gpio.h */
